/**
 * FormTableParser - 表单式表格解析器
 * 
 * 用于识别和转换"表单式"布局的Excel表格，如：
 * | 姓名:  | 张三   | 性别: | 男   |
 * | 身份证号: | 123... | 民族: | 汉   |
 * 
 * 转换为标准的键值对格式
 */

class FormTableParser {
    /**
     * 检测工作表是否为表单式布局
     * 特征：
     * 1. 第一行不太像普通表头（包含冒号的标签）
     * 2. 标签和值交替排列
     * 3. 每行有多组 标签:值 对
     */
    static isFormStyleLayout(worksheet) {
        // 采样前10行进行分析
        const sampleRows = [];
        for (let i = 1; i <= Math.min(10, worksheet.rowCount); i++) {
            const row = worksheet.getRow(i);
            const cells = [];
            row.eachCell({ includeEmpty: false }, (cell, colNumber) => {
                let val = cell.value;
                if (val !== null && val !== undefined) {
                    if (typeof val === 'object') {
                        if (val.text) val = val.text;
                        else if (val.richText) val = val.richText.map(t => t.text).join('');
                        else val = String(val);
                    }
                    cells.push({ col: colNumber, value: String(val).trim() });
                }
            });
            sampleRows.push(cells);
        }

        if (sampleRows.length === 0) return false;

        // 计算包含冒号的字段数量（包括冒号在中间或末尾的情况）
        let colonCount = 0;
        let totalCells = 0;
        const labelPattern = /[:：]/;

        for (const row of sampleRows) {
            for (const cell of row) {
                if (cell.value) {
                    totalCells++;
                    // 检测是否包含冒号（可能在末尾或中间）
                    if (labelPattern.test(cell.value)) {
                        colonCount++;
                    }
                }
            }
        }

        // 如果超过15%的非空单元格包含冒号，认为是表单式
        const colonRatio = totalCells > 0 ? colonCount / totalCells : 0;
        console.log(`[FormTableParser] Colon ratio: ${colonRatio.toFixed(2)} (${colonCount}/${totalCells})`);

        return colonRatio > 0.15;
    }

    /**
     * 解析表单式工作表，提取所有键值对
     */
    static parseFormStyleSheet(worksheet) {
        const data = {};
        // 匹配以冒号结尾的标签，或者包含冒号的标签
        const labelEndPattern = /[:：]\s*$/;
        const labelContainsPattern = /[:：]/;

        console.log(`[FormTableParser] Starting to parse worksheet with ${worksheet.rowCount} rows`);

        worksheet.eachRow((row, rowNumber) => {
            const cells = [];
            row.eachCell({ includeEmpty: false }, (cell, colNumber) => {
                let val = cell.value;
                if (val !== null && val !== undefined) {
                    if (typeof val === 'object') {
                        if (val instanceof Date) {
                            // Format date
                            const y = val.getUTCFullYear();
                            const mo = String(val.getUTCMonth() + 1).padStart(2, '0');
                            const d = String(val.getUTCDate()).padStart(2, '0');
                            val = `${y}-${mo}-${d}`;
                        } else if (val.text) {
                            val = val.text;
                        } else if (val.richText) {
                            val = val.richText.map(t => t.text).join('');
                        } else {
                            val = String(val);
                        }
                    }
                    cells.push({ col: colNumber, value: String(val).trim() });
                }
            });

            console.log(`[FormTableParser] Row ${rowNumber}: ${cells.map(c => `[${c.col}]${c.value}`).join(' | ')}`);

            // 遍历单元格，找到标签:值对
            for (let i = 0; i < cells.length; i++) {
                const current = cells[i];

                // 方式1：标签以冒号结尾，下一个单元格是值
                if (current.value && labelEndPattern.test(current.value)) {
                    const label = current.value.replace(labelEndPattern, '').trim();
                    const next = cells[i + 1];
                    let value = '';
                    let consumedNext = false;

                    // 检查下一个单元格是否也是标签（防止将下一个标签误认为值）
                    if (next && next.value) {
                        const nextIsLabel = labelEndPattern.test(next.value);
                        if (!nextIsLabel) {
                            value = next.value;
                            consumedNext = true;
                        }
                    }

                    if (label && !data[label]) {
                        data[label] = value;
                        console.log(`[FormTableParser] Found (end colon): ${label} = ${value}`);
                    }

                    // 如果消耗了下一个单元格作为值，跳过它
                    if (consumedNext) {
                        i++;
                    }
                }
                // 方式2：标签和值在同一个单元格，用冒号分隔
                else if (current.value && labelContainsPattern.test(current.value) && !labelEndPattern.test(current.value)) {
                    const parts = current.value.split(/[:：]/);
                    if (parts.length >= 2) {
                        const label = parts[0].trim();
                        const value = parts.slice(1).join(':').trim();
                        if (label && !data[label]) {
                            data[label] = value;
                            console.log(`[FormTableParser] Found (inline colon): ${label} = ${value}`);
                        }
                    }
                }
            }
        });

        console.log(`[FormTableParser] Parsed data:`, data);
        return data;
    }

    /**
     * 将表单数据转换为标准预览格式
     */
    static convertToPreviewFormat(formData) {
        // 定义字段映射（标签 -> 系统字段）
        const fieldMapping = {
            '姓名': 'name',
            '性别': 'gender',
            '身份证号': 'id_card',
            '身份证号码': 'id_card',
            '出生日期': 'birth_date',
            '出生日\n期': 'birth_date',  // 处理换行
            '民族': 'ethnic',
            '婚姻状况': 'marital_status',
            '婚姻状\n况': 'marital_status',
            '最高学历': 'education',
            '最高学\n历': 'education',
            '学历': 'education',
            '职业': 'occupation',
            '职务': 'position',
            '政治面貌': 'political_status',
            '政治面\n貌': 'political_status',
            '从业单位': 'workplace',
            '从业单\n位': 'workplace',
            '工作单位': 'workplace',
            '户籍地区划': 'province',
            '户籍地区\n划': 'province',
            '户籍地址': 'address',
            '户籍地\n址': 'address',
            '籍贯': 'native_place',
            '其它地址': 'other_address',
            '其它地\n址': 'other_address',
            '联系电话': 'phone',
            '电话': 'phone',
            '手机': 'phone',
            '血型': 'blood_type',
            '曾用名': 'former_name',
            '别名绑号': 'alias',
            '别名绰\n号': 'alias',
            '身高': 'height',
            '体貌特征描述': 'appearance',
            '体貌特征\n描述': 'appearance',
            '兵役状况': 'military_status',
            '兵役状\n况': 'military_status',
            '星座': 'zodiac',
            '生肖': 'chinese_zodiac',
            '行为标签': 'behavior_tags',
            '行为标\n签': 'behavior_tags'
        };

        // 转换为标准格式
        const standardData = {};
        const extraData = {};

        console.log(`[FormTableParser] Converting form data with ${Object.keys(formData).length} fields`);

        for (const [label, value] of Object.entries(formData)) {
            // 清理标签中的换行符
            const cleanLabel = label.replace(/\s+/g, '');
            const fieldKey = fieldMapping[label] || fieldMapping[cleanLabel];

            if (fieldKey) {
                standardData[fieldKey] = value;
                console.log(`[FormTableParser] Mapped: ${label} -> ${fieldKey} = ${value}`);
            } else {
                // 未映射的字段放入扩展数据
                extraData[label] = value;
                console.log(`[FormTableParser] Extra: ${label} = ${value}`);
            }
        }

        // 如果有额外字段，序列化到 extra_data
        if (Object.keys(extraData).length > 0) {
            standardData.extra_data = JSON.stringify(extraData);
        }

        console.log(`[FormTableParser] Final standardData:`, standardData);
        return standardData;
    }

    /**
     * 获取表单式布局的标准表头
     */
    static getFormStyleHeaders() {
        return [
            'name', 'id_card', 'gender', 'birth_date', 'ethnic',
            'marital_status', 'education', 'political_status',
            'workplace', 'position', 'phone', 'address', 'native_place'
        ];
    }

    /**
     * 获取表单式布局的中文表头映射
     */
    static getHeaderDisplayNames() {
        return {
            'name': '姓名',
            'id_card': '身份证号',
            'gender': '性别',
            'birth_date': '出生日期',
            'ethnic': '民族',
            'marital_status': '婚姻状况',
            'education': '学历',
            'political_status': '政治面貌',
            'workplace': '工作单位',
            'position': '职务',
            'phone': '联系电话',
            'address': '户籍地址',
            'native_place': '籍贯'
        };
    }
}

module.exports = FormTableParser;
